package br.com.translog.dao;

import br.com.translog.interfacee.IDAOCliente;
import br.com.translog.modelo.Cliente;
import br.com.translog.modelo.Logradouro;
import br.com.translog.modelo.PessoaJuridica;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DAOCliente implements IDAOCliente {
    
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("TranslogPU");

    private static EntityManager getEntityManager() {
        
        return emf.createEntityManager();
    }

    @Override
    public void cadastraCliente(Cliente c, PessoaJuridica pj, Logradouro l) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Persistindo os objetos...
            em.persist(pj);
            em.persist(l);
            em.persist(c);
            //Comitando a transacao...
            em.getTransaction().commit();
                 
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public void alteraCliente(Cliente c, PessoaJuridica pj, Logradouro l) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
                
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Atualizando os objetos...
            em.merge(pj);
            em.merge(l);
            em.merge(c);
            //Comitando a transacao...
            em.getTransaction().commit();
            
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public void excluiCliente(Cliente c, PessoaJuridica pj, Logradouro l) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Removendo os objetos...
            em.remove(pj);
            em.remove(l);
            em.remove(c);
            //Comitando a transacao...
            em.getTransaction().commit();
            
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public PessoaJuridica consultaCliente(int cnpj) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        PessoaJuridica pj;
        
        try {
            //Realizando a consulta...
            pj = (PessoaJuridica) em.createNamedQuery("PessoaJuridica.findByCnpj")
                    .setParameter("cnpj", cnpj)
                    .getSingleResult();
            
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return pj;
    }
}
